package model

import (
	"Short_chain_cats/database"
	"context"
	"fmt"
	"strconv"
	"time"
)

var TagsModel = UrlTag{}

type UrlTag struct {
	Id         int64     `gorm:"column:id;primary_key;AUTO_INCREMENT;NOT NULL;comment:'主键'"`
	ParentId   int64     `gorm:"column:parentId;NOT NULL;comment:'类别id'"`
	Name       string    `gorm:"column:name;default:NULL;comment:'标签名'"`
	Color      string    `gorm:"column:color;default:NULL;comment:'颜色'"`
	CreatedBy  int64     `gorm:"column:createdBy;NOT NULL;comment:'创建用户'"`
	CreateTime time.Time `gorm:"column:createTime;default:CURRENT_TIMESTAMP;NOT NULL;comment:'创建时间'"`
	UpdateTime time.Time `gorm:"column:updateTime;default:CURRENT_TIMESTAMP;NOT NULL;comment:'更新时间'"`
	IsDelete   int8      `gorm:"column:isDelete;default:0;NOT NULL;comment:'是否删除'"`
}

func (UrlTag) TableName() string {
	return "url_tag"
}

type UrlTagReq struct {
	Name string `gorm:"column:name;default:NULL;comment:'标签名'"`
}

func (q *UrlTagReq) GenerateTable(r *UrlTag) {
	r.Name = q.Name
	r.CreateTime = time.Now()
}

func (UrlTag) Search(ctx context.Context) (*[]UrlTag, error) {
	/*
		如果不需要在多个地方修改同一个结构体实例，直接使用结构体类型的实例化更为简单和直观。
		如果需要在多个地方共享并修改同一个结构体实例，或者处理较大的结构体，使用指针类型的实例化会更合适
	*/
	var tags []UrlTag
	err := database.NewOrm(ctx).Where("isDelete = ?", 0).Find(&tags).Error
	if err != nil {
		return nil, err
	}
	return &tags, nil
}

func (UrlTag) Add(ctx context.Context, tag UrlTag) (*UrlTag, error) {
	err := database.NewOrm(ctx).Create(&tag).Error
	if err != nil {
		fmt.Println("错误为：", err)
		return nil, err
	}
	return &tag, nil
}

// TagMap 返回map类型的标签映射关系
func (UrlTag) TagMap(ctx context.Context) (map[string]UrlTag, error) {
	//首先从数据库中查找所有的标签
	var tags []UrlTag
	tagsMap := make(map[string]UrlTag)
	err := database.NewOrm(ctx).Where("isDelete = ?", 0).Find(&tags).Error
	if err != nil {
		return nil, err
	}
	//开始映射
	for _, data := range tags {
		tagsMap[strconv.FormatInt(data.Id, 10)] = data
	}
	return tagsMap, nil

}
